package org.example.test;

import com.github.pagehelper.PageHelper;
import org.apache.commons.lang3.StringUtils;
import org.example.domain.TProduct;
import org.example.mapper.ProductMapper;
import org.example.query.ProductQuery;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import tk.mybatis.mapper.entity.Example;

import java.util.ArrayList;
import java.util.List;

@SpringBootTest
@RunWith(SpringRunner.class)
public class product表高级查询示例 {
    @Autowired
    private ProductMapper productMapper;
    /*
        1. 根据name进行模糊查询
        2. 根据state状态进行等值查询
        3. 根据saleprice进行区间查询
        4. 根据salecount进行区间查询
     */
    @Test
    public void 高级查询(){
        ProductQuery query = new ProductQuery();
        query.setName("精华版");
        query.setBeginSalePrice(999.00);

        //意思：就是说这个专门封装查询条件的Example对象，需要你指定它操作哪一个具体的javabean对象--->对应table表
        Example example = new Example(TProduct.class);//它是专门用业装查询条件的
        //条件应该如何拼接呢？
        if (StringUtils.isNotBlank(query.getName())) {
            //开始拼接模糊查询条件
            example.and().andLike("name","%"+query.getName()+"%");
        }

        //state的等值查询
        if (query.getState() != null) {
            example.and().andEqualTo("state",query.getState());
        }
        //saleprice的区间查询  begin <= saleprice <= end
        if (query.getBeginSalePrice() != null) {
            example.and().andGreaterThanOrEqualTo("saleprice",query.getBeginSalePrice());
        }
        if (query.getEndSalPrice() != null) {
            example.and().andLessThanOrEqualTo("saleprice",query.getEndSalPrice());
        }

        // salecount区间查询
        if (query.getBeginSaleCount() != null) {
            example.and().andGreaterThanOrEqualTo("salecount",query.getBeginSaleCount());
        }
        if (query.getEndSalPrice() != null) {
            example.and().andLessThanOrEqualTo("salecount",query.getEndSalPrice());
        }



        List<TProduct> productList = productMapper.selectByExample(example);
        for (TProduct tProduct : productList) {
            System.out.println(tProduct);
        }
    }

    @Test
    public void testAndOrQuery(){
       /*
       （ 根据name进行模糊查询 且  根据state状态进行等值查询）或 根据saleprice进行区间查询
     */
        ProductQuery query = new ProductQuery();
        query.setName("精华版");
        query.setState(1);
        query.setBeginSalePrice(999.00);
        query.setEndSalPrice(1001.00);

        Example example = new Example(TProduct.class);
        //2个条件进行且的连接
        Example.Criteria and = example.and();
        and.andLike("name","%"+query.getName()+"%").andEqualTo("state",query.getState());
        //如果是要进行或的连接
        Example.Criteria or = example.or();
        or.andGreaterThanOrEqualTo("saleprice",query.getBeginSalePrice()).andLessThanOrEqualTo("saleprice",query.getEndSalPrice());

        productMapper.selectByExample(example);
    }

    @Test
    public void 测试带条件分页查询(){
       /*
       （ 根据name进行模糊查询 且  根据state状态进行等值查询）或 根据saleprice进行区间查询
     */
        ProductQuery query = new ProductQuery();
        query.setName("精华版");
        query.setState(1);
        query.setBeginSalePrice(999.00);
        query.setEndSalPrice(1001.00);

        Example example = new Example(TProduct.class);
        //2个条件进行且的连接
        Example.Criteria and = example.and();
        and.andLike("name","%"+query.getName()+"%").andEqualTo("state",query.getState());
        //如果是要进行或的连接
        Example.Criteria or = example.or();
        or.andGreaterThanOrEqualTo("saleprice",query.getBeginSalePrice()).andLessThanOrEqualTo("saleprice",query.getEndSalPrice());

        //如果要进行分页查询，只需要在执行普通查询的查询语句前面，添加上分页的参数（起始页码+每页查询的条数）
        PageHelper.startPage(4,3);
        productMapper.selectByExample(example);
    }
}
